/**
 *  This file is part of WiFiStorer.

    WiFiStorer is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    WiFiStorer is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with WiFiStorer.  If not, see <http://www.gnu.org/licenses/>.
    
    @author Ontic Soluciones
    @license GNU GPLv3
    @copyright 2010 Ontic Soluciones
    @link http://www.ontic.es
    @contact android@ontic.es
    
 */


package com.Storer;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import com.Storer.R;

import android.app.ExpandableListActivity;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ExpandableListView;
import android.widget.SimpleExpandableListAdapter;


/**
 * Muestra una lista extensible de tablas y wifis, de forma que podamos elegir una para pintarla.
 * @author Ontic Soluciones

 *
 */
public class ListaTablas extends ExpandableListActivity {	

	private SQLiteDatabase DB;
	private DataBaseHelper db;
	private Context context;
	private String tablas[];
	private String redes[];
	private Cursor tables;
	private Cursor networks;
	private ArrayList<String[]> hijos = new ArrayList<String[]>();
	private Intent i;
	
	@SuppressWarnings("unchecked")
	public void onCreate(Bundle savedInstanceState)
	{
      super.onCreate(savedInstanceState);
      
      db = new DataBaseHelper(this);
      DB = db.getReadableDatabase();
      i=getIntent();
	  context = (this);   
	  setContentView(R.layout.expandablelist);
	  formateaTablasYRedes();
	 
	  /*Cerramos la base de datos cuando ya no la necesitamos más*/
      DB.close();
	  
	  SimpleExpandableListAdapter expListAdapter =
			new SimpleExpandableListAdapter(
				this,
				creaListaPadres(),	// Crea la lista con las entradas de primer nivel
				R.layout.filas1,	// Layout para el estilo
				new String[] { "tabla" },	// Clave por la que se muestran las entradas de primer nivel
				new int[] { R.id.tabla },
				creaListaHijos(),	// Crea la lista con las entradas de segundo nivel 
				R.layout.filas,	// Layout para el estilo
				new String[] { "red", "mac"},	// Clave por la que se muestran las entradas de segundo nivel
				new int[] { R.id.red, R.id.mac }
			);
	  setListAdapter(expListAdapter);
    }
	

	/**
	 * Guarda los datos de la wifi elegida y envía el resultado a la actividad que le llamó.
	 */
    public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) 
    {
    	tables.moveToPosition(groupPosition);

    	i.putExtra("tabla",tables.getString(0));
    	i.putExtra("wifi", hijos.get(groupPosition)[childPosition*2+1]);
    	this.setResult(RESULT_OK, i);

        finish();
        return super.onChildClick(parent, v, groupPosition, childPosition, id);
    }
	
    
    /**
     * Selecciona todas las redes y tablas de la BD y hace que se guarden en arrays para poder mostrarse
     * en la lista extensible.
     */
	private void formateaTablasYRedes()
	{
		// TODO Auto-generated method stub
		  tables = DB.rawQuery("select * from sqlite_sequence ORDER BY NAME DESC",null);
	      tables.moveToFirst();
	      
	     tablas = new String[tables.getCount()];
	    
	      for(int i = 0 ; i<tables.getCount(); i++)
	      {
	    	  String aux = tables.getString(0);    	  
	    	  aux= aux.substring(1);	    	
	    	  tablas[i]= ""+aux.substring(6)+"/"+aux.substring(4, 6)+"/"+aux.substring(0, 4); 

	    	  networks = DB.rawQuery("select distinct ssid, bssid from t"+aux+" order by ssid",null);	  
	    	  networks.moveToFirst();
	    	  redes = new String[networks.getCount()*2];
	    	  for(int z = 0; z<networks.getCount()*2; z+=2 )
	    	  {
	    		  redes[z] = networks.getString(0);
	    		  redes[z+1]=networks.getString(1);
	    		  networks.moveToNext();
	    	  }	  
	    	  hijos.add(redes);
	    	  tables.moveToNext();
	      }
	}
	
	/**
	  * Crea la lista de padres cumpliendo con la estructura necesaria para la lista extensible.
	  * La lista contiene Maps que tienen las tablas de la BD.
	  *
	  */
		@SuppressWarnings({ "rawtypes", "unchecked" })
		private List creaListaPadres() {
		  ArrayList resultado = new ArrayList();
		  for( int i = 0 ; i < tablas.length ; ++i ) {
			HashMap padre = new HashMap();
		    padre.put( "tabla",tablas[i] );
			resultado.add( padre );
		  }
		  return (List)resultado;
	    }

	/**
	  * Crea la lista de hijos cumpliendo con la estructura necesaria para la lista extensible.
	  * La lista contiene otra lista con Maps, cada Map tiene un vector en el que guarda el nombre de 
	  * la red con su mac a continuación.
	  */
	  @SuppressWarnings({ "rawtypes", "unchecked" })
	private List creaListaHijos() {
		ArrayList resultado = new ArrayList();
		for( int i = 0 ; i < hijos.size() ; ++i ) {
	// Second-level lists
		  ArrayList aux = new ArrayList();
		  for( int n = 0 ; n < hijos.get(i).length ; n += 2 ) {
		    HashMap hijo = new HashMap();
			hijo.put( "red", hijos.get(i)[n]);
		    hijo.put( "mac", hijos.get(i)[n+1]);
			aux.add( hijo );
		  }
		  resultado.add( aux );
		}
		return resultado;
	  }
	  
	public void onPause()
	{
		super.onPause();
	}
	
	
	public boolean onCreateOptionsMenu(Menu menu) 
	{
        menu.add(0, 0, 0,R.string.kml).setIcon(android.R.drawable.ic_menu_edit);
        menu.add(0, 4, 0, R.string.sendKml).setIcon(android.R.drawable.ic_dialog_email);
		
        return(super.onCreateOptionsMenu(menu));
    }
    

	@Override
	public boolean onOptionsItemSelected(MenuItem item) 
	{
	    // Handle item selection
	    switch (item.getItemId()) {
	    case 0:
	    	Intent i = new Intent(context, ListaKml.class);
	        startActivity(i);
	        finish();
	        break;
	        
	    case 4: 
	    	Intent inte = new Intent(ListaTablas.this, SendKml.class);
	    	startActivity(inte);
	    	finish();
	    	break;

	    default:
	        return super.onOptionsItemSelected(item);
	    }
		return false;
	}
}